package es.uned.etsii.si3.taller;

import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import java.math.BigDecimal;
import java.sql.SQLException;

@DatabaseTable(tableName = "materiales")
public
class Material extends Persistente {
	public static final String ID_FIELD_NAME = "id";
	public static final String NOMBRE_FIELD_NAME = "nombre";
	public static final String DESCRIPCION_FIELD_NAME = "descripcion";
	public static final String COSTE_FIELD_NAME = "coste";
	public static final String ACTIVO_FIELD_NAME = "activo";

	
	@DatabaseField(generatedId = true)
	int id;
	@DatabaseField(width = 50, index = true)
	String nombre;
	@DatabaseField(width = 100)
	String descripcion;
	@DatabaseField
	BigDecimal coste;
	@DatabaseField
	boolean activo;

	/**
	 * Factoría para crear nuevos materiales partiendo de un conjunto de datos,
	 * al tiempo que se crear el objeto en la base de datos
	 *
	 * @param  nombre      nombre del material (para listados)
	 * @param  descripcion descripción del material (para detalle)
	 * @param  coste       coste del material, para facturación
	 * @return             un nuevo objeto, ya guardado en la base de datos
	 */
	public
	static Material crear(String nombre, String descripcion, BigDecimal coste) throws SQLException {
		Material material = new Material();

		material.setNombre(nombre);
		material.setDescripcion(descripcion);
		material.setCoste(coste);
		material.setActivo(false);
		getClassDao(Material.class).create(material);

		return material;
	}

	public
	Material() {
		// ORM Lite necesita un constructor por defecto
	}

	/**
	 * getters y setters
	 */
	public int        getId()          { return id; }
	public String     getNombre()      { return nombre; }
	public String     getDescripcion() { return descripcion; }
	public BigDecimal getCoste()       { return coste; }
	public boolean    getActivo()      { return activo; }

	public
	void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public
	void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public
	void setCoste(BigDecimal coste) {
		this.coste = coste;
	}

	public
	void setActivo(boolean activo) {
		this.activo = activo;
	}

	/**
	 * Función que permite activar un material
	 * @throws SQLException
	 */
	public
    void activar() throws SQLException {
		setActivo(true);
		update();
	}

	/**
	 * Función que permite desactivar un material
	 * @throws SQLException
	 */
	public
	void desactivar() throws SQLException {
		setActivo(false);
		update();
	}
}
